package com.ruoyi.cmdb.service.impl;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import cn.hutool.core.util.ObjectUtil;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryMethods;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.ruoyi.common.core.utils.MapstructUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.orm.core.page.PageQuery;
import com.ruoyi.common.orm.core.page.TableDataInfo;
import com.ruoyi.common.orm.core.service.impl.BaseServiceImpl;
import com.ruoyi.common.core.utils.DateUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Arrays;
import com.ruoyi.cmdb.domain.CmdbModelFields;
import com.ruoyi.cmdb.mapper.CmdbModelFieldsMapper;
import static com.ruoyi.cmdb.domain.table.CmdbModelFieldsTableDef.CMDB_MODEL_FIELDS;
import com.ruoyi.cmdb.mapper.CmdbModelsMapper;
import com.ruoyi.cmdb.domain.CmdbModels;
import com.ruoyi.cmdb.domain.bo.CmdbModelsBo;
import com.ruoyi.cmdb.domain.vo.CmdbModelsVo;
import com.ruoyi.cmdb.service.ICmdbModelsService;
import static com.ruoyi.cmdb.domain.table.CmdbModelsTableDef.CMDB_MODELS;

/**
 * 模型管理Service业务层处理
 *
 * @author mfq
 * 2024-11-29
 */
@Service
public class CmdbModelsServiceImpl extends BaseServiceImpl<CmdbModelsMapper, CmdbModels> implements ICmdbModelsService
{
    @Resource
    private CmdbModelsMapper cmdbModelsMapper;
    @Resource
    private CmdbModelFieldsMapper cmdbModelFieldsMapper;

    @Override
    public QueryWrapper query() {
        return super.query().from(CMDB_MODELS);
    }

    private QueryWrapper buildQueryWrapper(CmdbModelsBo cmdbModelsBo) {
        QueryWrapper queryWrapper = super.buildBaseQueryWrapper();
        queryWrapper.and(CMDB_MODELS.MODEL_ID.like(cmdbModelsBo.getModelId()));
        queryWrapper.and(CMDB_MODELS.PARENT_MODEL_IDS.like(cmdbModelsBo.getParentModelIds()));
        queryWrapper.and(CMDB_MODELS.MODEL_NAME.like(cmdbModelsBo.getModelName()));
        queryWrapper.and(CMDB_MODELS.NAMESPACE.eq(cmdbModelsBo.getNamespace()));
        queryWrapper.and(CMDB_MODELS.CLASSIFY_ID.eq(cmdbModelsBo.getClassifyId()));
        queryWrapper.and(CMDB_MODELS.IS_DEFALUT.eq(cmdbModelsBo.getIsDefalut()));
        queryWrapper.and(CMDB_MODELS.IS_SHOW.eq(cmdbModelsBo.getIsShow()));
        queryWrapper.and(CMDB_MODELS.MODEL_TYPE.eq(cmdbModelsBo.getModelType()));
        queryWrapper.and(CMDB_MODELS.DESCRIPTION.eq(cmdbModelsBo.getDescription()));
        queryWrapper.and(CMDB_MODELS.FORM_DESIGNER.eq(cmdbModelsBo.getFormDesigner()));

        return queryWrapper;
    }

    /**
     * 查询模型管理
     *
     * @param id 模型管理主键
     * @return 模型管理
     */
    @Override
    public CmdbModelsVo selectById(String id)
    {
        return cmdbModelsMapper.selectOneWithRelationsByQueryAs(query().where(CMDB_MODELS.ID.eq(id)), CmdbModelsVo.class);

    }

    /**
     * 查询模型管理列表
     *
     * @param cmdbModelsBo 模型管理Bo
     * @return 模型管理集合
     */
    @Override
    public List<CmdbModelsVo> selectList(CmdbModelsBo cmdbModelsBo)
    {
        QueryWrapper queryWrapper = buildQueryWrapper(cmdbModelsBo);
        return cmdbModelsMapper.selectListWithRelationsByQueryAs(queryWrapper, CmdbModelsVo.class);
    }

    /**
     * 分页查询模型管理列表
     *
     * @param cmdbModelsBo 模型管理Bo
     * @return 分页模型管理集合
     */
    @Override
    public TableDataInfo<CmdbModelsVo> selectPage(CmdbModelsBo cmdbModelsBo)
    {
        QueryWrapper queryWrapper = buildQueryWrapper(cmdbModelsBo);
        Page<CmdbModelsVo> page = cmdbModelsMapper.paginateWithRelationsAs(PageQuery.build(), queryWrapper, CmdbModelsVo.class);
        return TableDataInfo.build(page);
    }

    /**
     * 新增模型管理
     *
     * @param cmdbModelsBo 模型管理Bo
     * @return 结果:true 操作成功，false 操作失败
     */
    @Transactional
    @Override
    public boolean insert(CmdbModelsBo cmdbModelsBo)
    {
        CmdbModels cmdbModels = MapstructUtils.convert(cmdbModelsBo, CmdbModels.class);


        boolean inserted = this.save(cmdbModels);//使用全局配置的雪花算法主键生成器生成ID值
        if (inserted && ObjectUtil.isNotNull(cmdbModels)) {
            return insertCmdbModelFields(cmdbModels);
        }
        return false;
    }

    /**
     * 新增模型管理，前台提供主键值，一般用于导入的场合
     *
     * @param cmdbModelsBo 模型管理Bo
     * @return 结果:true 操作成功，false 操作失败
     */
        @Transactional
    @Override
    public boolean insertWithPk(CmdbModelsBo cmdbModelsBo)
    {
        CmdbModels cmdbModels = MapstructUtils.convert(cmdbModelsBo, CmdbModels.class);


            boolean inserted = cmdbModelsMapper.insertWithPk(cmdbModels) > 0;//前台传来主键值
            if (inserted && ObjectUtil.isNotNull(cmdbModels)) {
                return insertCmdbModelFields(cmdbModels);
            }
            return false;
    }

    /**
     * 修改模型管理
     *
     * @param cmdbModelsBo 模型管理Bo
     * @return 结果:true 更新成功，false 更新失败
     */
    @Transactional
    @Override
    public boolean update(CmdbModelsBo cmdbModelsBo)
    {
        CmdbModels cmdbModels = MapstructUtils.convert(cmdbModelsBo, CmdbModels.class);
        if(ObjectUtil.isNotNull(cmdbModels) && ObjectUtil.isNotNull(cmdbModels.getId())) {
            boolean updated = this.updateById(cmdbModels);
            if (updated) {
                QueryWrapper queryWrapper = QueryWrapper.create().from(CMDB_MODEL_FIELDS).where(CMDB_MODEL_FIELDS.MODEL_ID.eq(cmdbModels.getId()));
                cmdbModelFieldsMapper.deleteByQuery(queryWrapper);
                return insertCmdbModelFields(cmdbModels);
            }
        }
        return false;
    }


    /**
     * 批量删除模型管理
     *
     * @param ids 需要删除的模型管理主键集合
     * @return 结果:true 删除成功，false 删除失败
     */
    @Transactional
    @Override
    public boolean deleteByIds(String[] ids)
    {
        QueryWrapper queryWrapper = QueryWrapper.create().from(CMDB_MODEL_FIELDS).where(CMDB_MODEL_FIELDS.MODEL_ID.in(Arrays.asList(ids)));
        cmdbModelFieldsMapper.deleteByQuery(queryWrapper);
        return this.removeByIds(Arrays.asList(ids));
    }

    /**
     * 新增模型属性信息
     *
     * @param cmdbModels 模型管理对象
     */
    private boolean insertCmdbModelFields(CmdbModels cmdbModels)
    {
        List<CmdbModelFields> cmdbModelFieldsList = cmdbModels.getCmdbModelFieldsList();
        String id = cmdbModels.getId();
        if (StringUtils.isNotNull(cmdbModelFieldsList))
        {
            List<CmdbModelFields> list = new ArrayList<>();
            for (CmdbModelFields cmdbModelFields : cmdbModelFieldsList)
            {
                cmdbModelFields.setModelId(id);
                list.add(cmdbModelFields);
            }
            if (list.size() > 0)
            {
                return cmdbModelFieldsMapper.insertBatch(list)>0;
            }
        }
        return true;
    }
}
